const dayjs = require('dayjs');
const router = require("koa-router")();

const { getDbHelper, dbs } = require("../DbHelpers");

router.prefix("/api/db", '数据库相关操作服务');

/**
 * 获取数据库服务器列表。
 */
router.get("/servers", async (ctx, next) => {
  await (ctx.body = dbs);
}, '数据库服务列表');

/**
 * 获取数据库列表。
 */
router.get("/:dbIndex/dbs", async (ctx, next) => {
  let dbIndex = ctx.params.dbIndex;
  let rs = await getDbHelper(dbIndex).databases();

  ctx.body = rs;
}, { desc: '数据库列表', dbIndex: '数据库服务序号或名称' });

/**
 * 获取数据库的表信息。
 */
router.get("/:dbIndex/:dbName/tables", async (ctx, next) => {
  let dbIndex = ctx.params.dbIndex || 0;
  let dbName = ctx.params.dbName || "mysql";

  await getDbHelper(dbIndex).tables(dbName).then(
    rs => (ctx.body = rs),
    reason => (ctx.body = reason)
  );
}, { desc: '获取数据库的表信息', dbIndex: '数据库服务序号或名称', dbName: '数据库名称' });

/**
 * 获取表的字段列表。
 */
router.get("/:dbIndex/:dbName/:tableName/columns", async (ctx, next) => {
  let dbIndex = ctx.params.dbIndex || 0;
  let dbName = ctx.params.dbName || "mysql";
  let tableName = ctx.params.tableName;

  if (tableName) {
    await getDbHelper(dbIndex).columns(dbName, tableName).then(
      rs => (ctx.body = rs),
      reason => (ctx.body = reason)
    );
  } else {
    ctx.body = {
      msg: "没有指定表名称！"
    };
  }
}, { desc: '获取表的字段列表', dbIndex: '数据库服务序号或名称', dbName: '数据库名称', tableName: '表名称' });

/**
 * 获取表的定义语句。
 * @param :dbIndex 服务器序号
 * @param :dbName 数据库名称
 * @param :tableName 表名称
 */
router.get("/:dbIndex/:dbName/:tableName/ddl", async (ctx, next) => {
  let dbIndex = ctx.params.dbIndex || 0;
  let dbName = ctx.params.dbName || "mysql";
  let tableName = ctx.params.tableName;

  if (tableName) {
    await getDbHelper(dbIndex).tableDDL(dbName, tableName).then(
      rs => (ctx.body = rs),
      reason => (ctx.body = reason)
    );
  } else {
    ctx.body = ctx.getResponse("没有指定表名称！");
  }
}, { desc: '获取表的定义语句', dbIndex: '数据库服务序号或名称', dbName: '数据库名称', tableName: '表名称' });

/**
 * 获取表的常用操作语句。
 * @param :dbIndex 服务器序号
 * @param :dbName 数据库名称
 * @param :tableName 表名称
 */
router.get("/:dbIndex/:dbName/:tableName/dml", async (ctx, next) => {
  let dbIndex = ctx.params.dbIndex || 0;
  let dbName = ctx.params.dbName || "master";
  let tableName = ctx.params.tableName;

  if (tableName) {
    let rs = await getDbHelper(dbIndex).tableDML(dbName, tableName);

    ctx.body = rs;
  } else {
    ctx.body = ctx.getResponse("没有指定表名称！");
  }
}, { desc: '获取表的常用操作语句', dbIndex: '数据库服务序号或名称', dbName: '数据库名称', tableName: '表名称' });

/**
 * 获取表的数据。
 *
 * @param :dbIndex 数据库服务器序号
 * @param :dbName 数据库名称
 * @param :tableName 表名称
 */
router.post("/:dbIndex/:dbName/:tableName/datas", async (ctx, next) => {
  let dbIndex = ctx.params.dbIndex || 0;
  let dbName = ctx.params.dbName || "mysql";
  let tableName = ctx.params.tableName;

  let so = ctx.request.body;

  if (tableName) {
    await getDbHelper(dbIndex).tableDatas(dbName, tableName, so).then(
      rs => (ctx.body = rs),
      reason => (ctx.body = reason)
    );
  } else {
    ctx.body = ctx.getResponse("没有指定表名称！");
  }
}, {
  desc: '获取表的数据', dbIndex: '数据库服务序号或名称', dbName: '数据库名称', tableName: '表名称',
  body: {
    pageInde: { type: 'integer', desc: '页码' },
    pageSize: { type: 'integer', desc: '每页显示数量' },
    filters: { $ref: 'filters' }
  }
});

/**
 * 获取数据库状态。
 */
router.post("/:dbIndex/status", async (ctx, next) => {
  let dbIndex = ctx.params.dbIndex || 0;
  let rs = await getDbHelper(dbIndex).status();

  ctx.body = rs;
}, { desc: ' 获取数据库状态', dbIndex: '数据库服务序号或名称' });

router.get('/:dbIndex/monitor', async (ctx) => {
  let dbIndex = ctx.params.dbIndex || 0;
  let rs = await getDbHelper(dbIndex).monitor();

  ctx.body = rs;
}, { desc: ' 获取数据库监控信息', dbIndex: '数据库服务序号或名称' })

/**
 * 获取数据库执行进程列表
 */
router.post("/:dbIndex/processlist", async (ctx, next) => {
  let dbIndex = ctx.params.dbIndex || 0;
  let rs = await getDbHelper(dbIndex).processes();

  ctx.body = rs;
}, { desc: '获取数据库执行进程列表', dbIndex: '数据库服务序号或名称' });

/**
 * 结束数据库执行进程。
 */
router.post("/:dbIndex/killprocess", async (ctx, next) => {
  let dbIndex = ctx.params.dbIndex || 0;
  let processId = ctx.request.body.processId;

  let rs = await getDbHelper(dbIndex).killProcess(processId);

  ctx.body = rs;
}, { desc: '结束数据库执行进程', dbIndex: '数据库服务序号或名称' });

router.get('/sqlite/tables', async (ctx) => {
  let rs = await ctx.sqlite.tables();

  ctx.body = rs;
}, '获取内置sqlite数据库表信息');

router.get('/sqlite/:tableName/columns', async (ctx) => {
  let tableName = ctx.params.tableName;

  let rs = await ctx.sqlite.columns(null, tableName);

  ctx.body = rs;
}, {
  desc: '获取内置sqlite数据库表的字段信息',
  tableName: '表名称'
});

router.post('/sqlite/:tableName/datas', async (ctx) => {
  let tableName = ctx.params.tableName;

  let rs = await ctx.sqlite.tableDatas(null, tableName, ctx.request.body);

  ctx.body = rs;
}, {
  desc: '获取内置sqlite数据库表的数据信息',
  tableName: '表名称',
  body: {
    pageInde: { type: 'integer', desc: '页码' },
    pageSize: { type: 'integer', desc: '每页显示数量' },
    filters: { $ref: 'filters' }
  }
});

module.exports = router;
